package com.kamistoat.netty.netty.simple;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.nio.charset.StandardCharsets;

/**
 * Netty客户端自定义handler
 */
public class NettyClientHandler extends ChannelInboundHandlerAdapter {

    /**
     * 当通道就绪时触发该事件方法。对于Client来说，通道就绪 意味着和Server建立了连接。
     * 该方法没有明确的任务指向，这里让其在通道就绪后，给Server发送消息
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("Client: " + ctx);
        // 同样使用 writeAndFlush() 将数据写到buffer中并刷新到channel中
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello, Server~", StandardCharsets.UTF_8));
    }

    /**
     * 当channel读就绪时触发该事件方法。
     * 对于Client端而言，就是读取Server回复的消息。
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println("Server回复信息: " + byteBuf.toString(StandardCharsets.UTF_8));
        System.out.println("Server地址: " + ctx.channel().remoteAddress());
    }

    /**
     * 异常处理
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
